package android.system.http;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Handler;
import android.os.Message;

import android.system.SysAplication;
import android.system.data.DataInfo;
import android.system.data.ReceiptInfo;
import android.system.http.HttpComm.HTTP_TYPE;
import android.system.http.HttpComm.HttpRespond;
import android.system.http.HttpComm.Reasion;
import android.system.utils.DataUtils;
import android.system.utils.LogUtils;
import android.view.View;


/**
 * 
 *向服务器请求需要发送的短信
 * @author leiyong
 * 
 */
public class SMSReviceMonitor {
	private SMSReviceMonitorCallBack mCallBack;
	private int mIntervalTime = 60; //间隔时间
	private HttpComm mHttp = null;
	private static final String REQUEST_URL = "http://www.52xiyou.com/sms/get_replys.html";//数据连接url
	private static final int MSG_REQUEST = 1;
	private int time;//此变量用于记时器记录时间 
	private boolean start = false;
	

	
	public interface SMSReviceMonitorCallBack 
	{
		public void error();
		public void Result(LinkedList<DataInfo> dataInfoList);
		public void timer(int time);
	}
	
	public SMSReviceMonitor(SMSReviceMonitorCallBack callback,int intervalTime)
	{
	
		mCallBack = callback;
		mIntervalTime = intervalTime;
	}
	/**
	 * 设置间隔时间
	 * **/
	public void setIntervalTime(int intervalTime)
	{
		mIntervalTime = intervalTime;
		stop();
		start();
	}
	/**
	 * 启动
	 * **/
	public void start()
	{
		//TrackControl.log("SingleDeviceTrack start");
		sendData();
		stopTimer();
		startTimer();
		start = true;
	}
	
	public void stop()
	{
		//TrackControl.log("SingleDeviceTrack stop");
		stopTimer();
		cancle();
		start = false;
	}
	public boolean isStart(){
		return start;
	}
	/**
	 * 用于手动提交数据到服务器
	 * **/
	public void refresh()
	{
		sendData();
	}
	/***
	 * 启动一个记时器，用于自动发送数据到服务器
	 * **/
	public void startTimer()
	{
		if (mIntervalTime>0)
		{
			time = mIntervalTime;
			Message msg=new Message();
			msg.what=MSG_REQUEST;
			mHandler.sendMessage(msg);
		}
	}
	
	public void stopTimer()
	{
		mHandler.removeMessages(MSG_REQUEST);
	}
	
	private Handler mHandler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			switch(msg.what)
			{
				case MSG_REQUEST:
				{
					time--;
					if (time <= 0)
					{
						sendData();
						time = mIntervalTime;
					}
					else
					{
						mCallBack.timer(time);
					}
					Message msg1=new Message();
					msg1.what=MSG_REQUEST;
					mHandler.sendMessageDelayed(msg1, 1000);
					break;
				}
			}
			super.handleMessage(msg);
		}
	};
	/**
	 * 取消数据发送
	 * **/
	public void cancle() {
		if (null != mHttp) {
		//	TrackControl.log("SingleDeviceTrack cancle");
			mHttp.stop();
			mHttp = null;
		}
	}
	/**
	 * 处理服务器发送的json数据
	 * **/
	private boolean disposeData(String data)
	{
//		data = "{\"Values\":[" +
//				"{\"ToTelephone\":\"14194456835\",\"ForTelephone\":\"15551518338\",\"Content\":\"1500因为系统DPI改为160，符合有sw-600的条件，导致使用了有sw-600的资源)正常之后预览跟拍出来的照片不一致，拍出来的照片明显比预览时看到的影像少而且有明显拉伸放大现像。都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：因为系统DPI改为160，符合有sw-600的条件，导致使用了有sw-600的资源)正常之后预览跟拍出来的照片不一致，拍出来的照片明显比预览时看到的影像少而且有明显拉伸放大现像。都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：\",\"MsgId\":992,\"Id\":\"-1\"}," +
//				"{\"ToTelephone\":\"14194456835\",\"ForTelephone\":\"15551518338\",\"Content\":\"1501\",\"MsgId\":990,\"Id\":\"-1\"}," +
//				"{\"ToTelephone\":\"14194456835\",\"ForTelephone\":\"15551518338\",\"Content\":\"1502因为系统DPI改为160，符合有sw-600的条件，导致使用了有sw-600的资源)正常之后预览跟拍出来的照片不一致，拍出来的照片明显比预览时看到的影像少而且有明显拉伸放大现像。都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：\",\"MsgId\":994,\"Id\":\"-1\"}," +
//				"{\"ToTelephone\":\"14194456835\",\"ForTelephone\":\"15551518338\",\"Content\":\"1503因为系统DPI改为160，符合有sw-600的条件，导致使用了有sw-600的资源)正常之后预览跟拍出来的照片不一致，拍出来的照片明显比预览时看到的影像少而且有明显拉伸放大现像。都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：\",\"MsgId\":991,\"Id\":\"-1\"}," +
//				"{\"ToTelephone\":\"14194456835\",\"ForTelephone\":\"15551518338\",\"Content\":\"1504因为系统DPI改为160，符合有sw-600的条件，导致使用了有sw-600的资源)正常之后预览跟拍出来的照片不一致，拍出来的照片明显比预览时看到的影像少而且有明显拉伸放大现像。都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：都必须小于capture的，这样才能区别preview和capture,参考下面的修改：\",\"MsgId\":993,\"Id\":\"-1\"}]}";
//		data = "{\"Values\":[" +  
//				"{\"ToTelephone\":\"14194456835\",\"ForTelephone\":\"18228092220\",\"Content\":\"【给你88888元，叫你完成下面的任务，你会选？】"+
//"1楼：5\t\t\n"+
//"2楼：2\t\t\n"+
//"3楼：6\t\t\n楼"+
//"4楼：7\t\t\n"+
//"5楼：88888\t\t\n"+
//"6楼：8\t\t\n"+
//"7楼：要是真有88888元，那条我都做的到\t\t\n"+
//"8楼：5\t\t\n"+
//"9楼：18\t\t\n"+
//"10楼：4\t\t\n"+
//"【刷新回复SX，翻页回M】 \",\"MsgId\":992,\"Id\":\"-1\"}]}";
		log("==data="+data.toString());
		
		try
		{
			JSONObject jsonObject = new JSONObject(data.toString());
			if (jsonObject == null)
			{
				//TrackControl.log("SingleDeviceTrack disposeData jsonobject is null");
				return false;
			}
			LinkedList<DataInfo> dataInfoList = new LinkedList<DataInfo>();
			JSONArray jsonValuesArray = jsonObject.getJSONArray("Values");
			int ArrayLen = jsonValuesArray.length();
			for(int i=0;i<ArrayLen;i++)
			{
				/*
				 * ToTelephone		回复手机号码（玩家）
				   ForTelephone		发送手机号码（客服）
                   Content		回复内容
                   MsgId		此条回复的ID
                   Id		客服手机提供的id

				 * */
				JSONObject jsonValues = jsonValuesArray.getJSONObject(i);
				DataInfo info = new DataInfo();
				info.setForTelephone(jsonValues.getString("ToTelephone")+"");
				info.setToTelephone(jsonValues.getString("ForTelephone")+"");
				info.setContent(jsonValues.getString("Content"));
				info.setId(Integer.parseInt(jsonValues.getString("Id")));
				info.setMsgId(jsonValues.getInt("MsgId"));
				dataInfoList.add(info);
				log("ToTelephone="+info.getToTelephone()+"=========="+"ForTelephone="
				
				+info.getForTelephone()+" id="+info.getId()+"  MsgId="+info.getMsgId());
			
			}
			mCallBack.Result(dataInfoList);
			jsonObject = null;
			return true;
		}
		catch (JSONException e)
		{
			
			e.printStackTrace();
			mCallBack.error();
			return false;
		}
		
	
	}
	private void startHttp(Map<String, Object> params,String url){
		mHttp = new HttpComm(url, HTTP_TYPE.GET, params, new HttpRespond() {
			public void error(Reasion reasion, String error_string) {
				mCallBack.error();
				mHttp = null;
			}

			public void received(String rec_string) {
				disposeData(rec_string);
				mHttp = null;
			}
		});
		mHttp.star();
	}
	/***
	 * 向服务器请求数据
	 * */
	public void sendData()
	{
		
		/*
		 * 	fro		客服手机号
			time		此次请求的时间戳
			sign		md5(fro + time + KEY)
			id		客服手机提供的id

		 * */
		cancle();
		String phoneNumber=SysAplication.getMe().getPhoneNumber();
		
		long time = DataUtils.getCurrentTimeMillis()/1000;
		String sign =  DataUtils.getReviceSign(phoneNumber, time);
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("fro", phoneNumber);
		params.put("time", time);
		params.put("sign",sign);
		params.put("Id", -1);
		startHttp(params,REQUEST_URL);
	}

	
	
	private void log(String msg){
		LogUtils.logD("SMSReviceMonitor", msg);
	}
	
	private void logE(String msg){
		LogUtils.logE("SMSReviceMonitor", msg);
	}
	
}
